
// Java标准库有两套处理日期和时间的API：
// 一套定义在java.util这个包里面，主要包括Date、Calendar和TimeZone这几个类；
// 一套新的API是在Java 8引入的，定义在java.time这个包里面，主要包括LocalDateTime、ZonedDateTime、ZoneId等。
import java.text.*;
import java.util.*;

public class Test {
    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        // 1、Date
        Date date = new Date();
        System.out.println(date.getYear() + 1900); // 必须加上1900
        System.out.println(date.getMonth() + 1); // 0~11，必须加上1
        System.out.println(date.getDate()); // 1~31，不能加1
        // 转换为String:
        System.out.println(date.toString());
        // 转换为GMT时区:
        System.out.println(date.toGMTString());
        // 转换为本地时区:
        System.out.println(date.toLocaleString());
        // 自定义的格式
        var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(date));

        System.out.println("-------------------");
        // 2、Calendar可以用于获取并设置年、月、日、时、分、秒，它和Date比，主要多了一个可以做简单的日期和时间运算的功能
        var calendar = Calendar.getInstance();
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.MONTH) + 1); // 0~11，必须加上1
        System.out.println(calendar.get(Calendar.DATE)); // 1~31，不能加1
        // 增加一天:
        calendar.add(Calendar.DATE, 1);
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.MONTH) + 1); // 0~11，必须加上1
        System.out.println(calendar.get(Calendar.DATE)); // 1~31，不能加1
        // Calendar.getTime()可以将一个Calendar对象转换成Date对象，
        Date date2 = calendar.getTime();
        System.out.println(sdf.format(date2));

        // Calendar 设置时间
        calendar.set(2020, 4, 1); // 2020-05-01
        Date date3 = calendar.getTime();
        System.out.println(sdf.format(date3));

        System.out.println("-------------------");

        // 3、TimeZone
        // Calendar和Date相比，它提供了时区转换的功能。时区用TimeZone对象表示：
        TimeZone tzDefault = TimeZone.getDefault(); // 当前时区
        TimeZone tzGMT9 = TimeZone.getTimeZone("GMT+09:00"); // GMT+9:00时区
        TimeZone tzNY = TimeZone.getTimeZone("America/New_York"); // 纽约时区
        System.out.println(tzDefault.getID()); // Asia/Shanghai
        System.out.println(tzGMT9.getID()); // GMT+09:00
        System.out.println(tzNY.getID()); // America/New_York
        System.out.println("-------------------");
        // 有了时区，我们就可以对指定时间进行转换
        Calendar cal = Calendar.getInstance();
        cal.set(2019, 10, 20, 8, 15, 0); // 任意时区下的 2019-11-20 08:15:00
        // 1. 先拿到瞬间（UTC 毫秒）
        Date instant = cal.getTime(); // 同一串毫秒
        // 2. 用不同时区去格式化
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+09:00"));
        System.out.println("东京: " + sdf.format(instant)); // 2019-11-20 08:15:00
        sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
        System.out.println("纽约: " + sdf.format(instant)); // 2019-11-19 18:15:00

    }

}